#include"mystdio.h"
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
static MyFile*BuyFile(int fd ,int flag)
{
    MyFile*f = (MyFile*)malloc(sizeof(MyFile));
    if(f == NULL)  return NULL;
    f->bufferlen = 0;
    f->fileno = fd;
    f->flag = flag;
    f->fflush_method = LINE_FLUSH;
    memset(f->outbuffer,0,sizeof(f->outbuffer));
    return f;
}

MyFile*MyFopen(const char*path,const char*mode){
    int fd = -1;
    int flag = 0;
    if(strcmp(mode,"w")==0)
    {
    flag = O_CREAT|O_WRONLY|O_TRUNC ;
    fd = open(path,flag,0666);
    }
    else  if(strcmp(mode,"a")==0)
    {
    flag = O_CREAT | O_WRONLY |O_APPEND ;
    fd = open(path,flag,0666);


    }
    else if(strcmp(mode,"r")==0)
    {
    flag = O_RDWR;
    fd = open(path,flag,0666);

    }
    else 
    {
      //
    }
    if(fd<0) return NULL;
    return  BuyFile(fd,flag);
}

  void MyFclose(MyFile *file)
{
    if(file->fileno < 0) return;//文件描述符小于0直接返回
    MyFFlush(file);
    close(file->fileno);
    free(file);
  }
 int MyFwrite(MyFile*file,void*str,int len)

{
    //1 copy
    memcpy(file->outbuffer+file->bufferlen,str,len);
    file->bufferlen+=len;
    //2,尝试判断是否满足刷新条件
    if((file->fflush_method & LINE_FLUSH)&&file->outbuffer[file->outbuffer[file->bufferlen-1]=='\n'])
    {
            MyFFlush(file);
    }
    return 0;
}
 void MyFFlush(MyFile*file){
        if(file->bufferlen<=0) return; //缓冲区没数据直接返回
        int n = write(file->fileno,file->outbuffer,file->bufferlen);//把数据从用户拷贝到内核文件缓冲区中
        (void) n;
        fsync(file->fileno);//把缓冲区的内容直接同步到外设
        file->bufferlen = 0;
 }                                       
                 
